
'use strict';
const ffi = require('ffi-napi');
const ref = require('ref-napi');
const TypeDef = require('./typedef');
const config = require('./config');

module.exports = function init(libFile) {
    // 映射接口
    return ffi.Library(libFile, {
        // 获取激活文件信息接口
        ASFGetActiveFileInfo: [TypeDef.MRESULT,
            [
                TypeDef.LPASF_ActiveFileInfo // [out] 激活文件信息
            ]
        ],

        // 在线激活接口
        ASFOnlineActivation: [TypeDef.MRESULT,
            [
                TypeDef.MPChar,    // [in]  APPID	官网下载
                TypeDef.MPChar,    // [in]  SDKKEY	官网下载
            ]
        ],

        // 在线激活接口，该接口与ASFOnlineActivation接口功能一致，推荐使用该接口
        ASFActivation: [TypeDef.MRESULT,
            [
                TypeDef.MPChar,    // [in]  APPID	官网下载
                TypeDef.MPChar,    // [in]  SDKKEY	官网下载
            ]
        ],

        // 初始化引擎
        ASFInitEngine:[TypeDef.MRESULT,
            [
                TypeDef.ASF_DetectMode, // [in]	AF_DETECT_MODE_VIDEO 视频模式：适用于摄像头预览，视频文件识别
                                        // AF_DETECT_MODE_IMAGE 图片模式：适用于静态图片的识别
                TypeDef.ASF_OrientPriority,   // [in]	检测脸部的角度优先值，参考 ArcFaceCompare_OrientPriority
                // video 模式有效值范围[2, 32], 推荐值为 16
                // image 模式有效值范围[2, 32], 推荐值为 32
                TypeDef.MInt32, // [in] 用于数值化表示的最小人脸尺寸，该尺寸代表人脸尺寸相对于图片长边的占比
                TypeDef.MInt32, // [in] 最大需要检测的人脸个数
                TypeDef.MInt32, // [in] 用户选择需要检测的功能组合，可单个或多个
                ref.refType(TypeDef.MHandle),// [out] 初始化返回的引擎handle
            ]
        ],

        /******************************************************
         * VIDEO模式:人脸追踪 IMAGE模式:人脸检测
         ******************************************************/
        ASFDetectFaces:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,            // [in] 引擎handle
                TypeDef.MInt32,             // [in] 图片宽度
                TypeDef.MInt32,             // [in] 图片高度
                TypeDef.MInt32,             // [in] 颜色空间格式
                ref.refType(TypeDef.MUInt8),// [in] 图片数据
                TypeDef.LPASF_MultiFaceInfo,// [out]检测到的人脸信息
                TypeDef.ASF_DetectModel,    // [in] 预留字段，当前版本使用默认参数即可
            ]
        ],

        /******************************************************
         * VIDEO模式:人脸追踪 IMAGE模式:人脸检测
         * 图像数据以结构体形式传入，对采用更高字节对齐方式的图像兼容性更好
         ******************************************************/
        ASFDetectFacesEx:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,             // [in] 引擎handle
                TypeDef.LPASF_ImageData,     // [in] 图片数据
                TypeDef.LPASF_MultiFaceInfo, // [out] 检测到的人脸信息
                TypeDef.ASF_DetectModel,     // [in]	预留字段，当前版本使用默认参数即可
            ]
        ],

        /************************************************************************
         * 取值范围[0-1]，默认值 BGR:0.5 IR:0.7， 用户可以根据实际需求，设置不同的阈值
         ************************************************************************/
        ASFSetLivenessParam:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,                 // [in] 引擎handle
                TypeDef.LPASF_LivenessThreshold  // [in] 活体置信度
            ]
        ],

        /************************************************************************
         * 年龄/性别/人脸3D角度（该接口仅支持RGB图像），最多支持4张人脸信息检测，超过部分返回未知
         * RGB活体仅支持单人脸检测，该接口不支持检测IR活体
         * 图像数据以结构体形式传入，对采用更高字节对齐方式的图像兼容性更好
         ************************************************************************/
        ASFProcess:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,  // [in] 引擎handle
                TypeDef.MInt32,   // [in] 图片宽度
                TypeDef.MInt32,   // [in] 图片高度
                TypeDef.MInt32,   // [in] 颜色空间格式
                ref.refType(TypeDef.MUInt8), // [in] 图片数据
                TypeDef.LPASF_MultiFaceInfo, // [in] 人脸信息，用户根据待检测的功能选择需要使用的人脸。
                TypeDef.MInt32, // [in] 只支持初始化时候指定需要检测的功能，在process时进一步在这个已经指定的功能集中继续筛选
                                // 例如初始化的时候指定检测年龄和性别，在process的时候可以只检测年龄，但是不能检测除年龄和性别之外的功能
            ]
        ],

        /************************************************************************
         * 年龄/性别/人脸3D角度（该接口仅支持RGB图像），最多支持4张人脸信息检测，超过部分返回未知
         * RGB活体仅支持单人脸检测，该接口不支持检测IR活体
         * 图像数据以结构体形式传入，对采用更高字节对齐方式的图像兼容性更好
         ************************************************************************/
        ASFProcessEx:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_ImageData,       // [in] 图片数据
                TypeDef.LPASF_MultiFaceInfo,   // [in] 人脸信息，用户根据待检测的功能选择需要使用的人脸。
                TypeDef.MInt32,                // [in] 只支持初始化时候指定需要检测的功能，在process时进一步在这个已经指定的功能集中继续筛选
                                               // 例如初始化的时候指定检测年龄和性别，在process的时候可以只检测年龄，但是不能检测除年龄和性别之外的功能
            ]
        ],

        /************************************************************************
         * 该接口目前仅支持单人脸IR活体检测（不支持年龄、性别、3D角度的检测），默认取第一张人脸
         ************************************************************************/
        ASFProcess_IR:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,  // [in] 引擎handle
                TypeDef.MInt32,   // [in] 图片宽度
                TypeDef.MInt32,   // [in] 图片高度
                TypeDef.MInt32,   // [in] 颜色空间格式
                ref.refType(TypeDef.MUInt8), // [in] 图片数据
                TypeDef.LPASF_MultiFaceInfo, // [in] 人脸信息，用户根据待检测的功能选择需要使用的人脸。
                TypeDef.MInt32, // [in] 目前只支持传入ASF_IR_LIVENESS属性的传入，且初始化接口需要传入
            ]
        ],

        /************************************************************************
         * 该接口目前仅支持单人脸IR活体检测（不支持年龄、性别、3D角度的检测），默认取第一张人脸
         * 图像数据以结构体形式传入，对采用更高字节对齐方式的图像兼容性更好
         ************************************************************************/
        ASFProcessEx_IR:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_ImageData,       // [in] 图片数据
                TypeDef.LPASF_MultiFaceInfo,   // [in] 人脸信息，用户根据待检测的功能选择需要使用的人脸。
                TypeDef.MInt32,                // [in] 目前只支持传入ASF_IR_LIVENESS属性的传入，且初始化接口需要传入
            ]
        ],

        /************************************************************************
         * 销毁引擎
         ************************************************************************/

        ASFUninitEngine:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,
            ]
        ],

        /************************************************************************
         * 获取版本信息
         ************************************************************************/
        ASFGetVersion:[TypeDef.ASF_VERSION,[]],

        /************************************************************************
         * 单人脸特征提取
         ************************************************************************/
        ASFFaceFeatureExtract:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,  // [in] 引擎handle
                TypeDef.MInt32,   // [in] 图片宽度
                TypeDef.MInt32,   // [in] 图片高度
                TypeDef.MInt32,   // [in] 颜色空间格式
                ref.refType(TypeDef.MUInt8), // [in] 图片数据
                TypeDef.LPASF_SingleFaceInfo, // [in] 单张人脸位置和角度信息
                TypeDef.MInt32,   // [out] 人脸特征
            ]
        ],

        /************************************************************************
         * 单人脸特征提取
         * 图像数据以结构体形式传入，对采用更高字节对齐方式的图像兼容性更好
         ************************************************************************/
        ASFFaceFeatureExtractEx:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_ImageData,       // [in] 图片数据
                TypeDef.LPASF_SingleFaceInfo,   // [in] 单张人脸位置和角度信息
                TypeDef.LPASF_FaceFeature,                 // [out] 人脸特征
            ]
        ],

        /************************************************************************
         * 人脸特征比对，推荐阈值 ASF_LIFE_PHOTO：0.80  ASF_ID_PHOTO：0.82
         ************************************************************************/
        ASFFaceFeatureCompare:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_FaceFeature,     // [in] 待比较人脸特征1
                TypeDef.LPASF_FaceFeature,     // [in] 待比较人脸特征2
                ref.refType(TypeDef.MFloat),   // [out] 比较结果，置信度数值
                TypeDef.ASF_CompareModel,      // [in] ASF_LIFE_PHOTO：用于生活照之间的特征比对
                                               // ASF_ID_PHOTO：用于证件照或证件照和生活照之间的特征比对
            ]
        ],

        /************************************************************************
         * 获取年龄信息
         ************************************************************************/
        ASFGetAge:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_AgeInfo,         // [out] 检测到的年龄信息
            ]
        ],

        /************************************************************************
         * 获取性别信息
         ************************************************************************/
        ASFGetGender:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_GenderInfo,         // [out] 检测到的性别信息
            ]
        ],

        /************************************************************************
         * 获取3D角度信息
         ************************************************************************/
        ASFGetFace3DAngle:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_Face3DAngle,         // [out] 检测到脸部3D 角度信息
            ]
        ],

        /************************************************************************
         * 获取RGB活体结果
         ************************************************************************/
        ASFGetLivenessScore:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_LivenessInfo,         // [out] 检测RGB活体结果
            ]
        ],

        /************************************************************************
         * 获取IR活体结果
         ************************************************************************/
        ASFGetLivenessScore_IR:[TypeDef.MRESULT,
            [
                TypeDef.MHandle,               // [in] 引擎handle
                TypeDef.LPASF_LivenessInfo,         // [out] 检测到IR活体结果
            ]
        ]
    });
};

